package com.qr.workqueue;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * 第一个消费者
 * 消费者1和消费者2的代码是相同的，都是去同一个队列中拿数据
 * 多个消费者之间对于同一个消息是竞争的关系
 * 但是会分开执行1 3 5 7 9     2 4 6 8 10
 */
public class Consumer_WorkQueue1 {
    public static void main(String[] args) throws Exception {
        //        创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
//        设置参数
        connectionFactory.setHost("192.168.150.100");
        connectionFactory.setPort(5672);
        //设置虚拟机，有一个默认值/
        connectionFactory.setVirtualHost("/");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");

//        创建连接connection
        Connection connection = connectionFactory.newConnection();
//        创建channel
        Channel channel = connection.createChannel();
//        创建队列
        /**
         * 队列名称
         * 是否被持久化，持久化后，mq重启，参数还在
         * exclusive：
         *      是否独占，只能有一个消费来监听队列
         *      当connection关闭时是否关闭队列
         *  autoDelete:
         *      是否自动删除，当没有consumer的时候
         */
        //如果没有helloworld这个队列则会创建该队列
        channel.queueDeclare("workqueues",true,false,false,null);

        //接收消息
        /**
         * queuq:队列名称
         * autoAck：是否自动确认，消费者一旦收到消息，自动给mq回复
         * callback:回调对象
         */
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            /**
             * 回调方法，当收到消息会自动执行该方法
             * consumerTag：消息标识
             * envelope：获取一些信息，交换机，路由key
             * properties:配置信息
             * body：数据
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //字节数组转为字符串
                System.out.println(new String(body));
                super.handleDelivery(consumerTag, envelope, properties, body);
            }
        };
        channel.basicConsume("workqueues",true,defaultConsumer);



    }
}
